#!/bin/bash
# by joevt May 10, 2023
# modified by Macschrauber Jun 17, 2024
# to use OpenCore disklabel 
# and to adjust working path, when called by AppleScript




# dump disk_label file
dump_label () {
    local contents
    contents=$(xxd -p -c99999 "$1"); echo "${contents:10}" | perl -pe "s/(..)/\1 /g;s/00/../g;s/ //g;s/(.{$((0x${contents:2:4}*2))})/\1\n/g"
}


makemultilinedisklabel () {

	if (( $# != 2 )); then
		echo "# error: not enough arguments" 1>&2
		echo "# usage: makemultilinedisklabel destinationpath disklabellines" 1>&2
		return 1
	fi
	local folder="$1"
	if [[ ! -d $folder ]]; then
		echo '# error: "'"$folder"' is not a folder' 1>&2
		echo "# usage: makemultilinedisklabel destinationpath disklabellines" 1>&2
		return 1
	fi
	local lines="$2"
	local alllines=""
	local alllines2x=""
	local tempfolder=""
	tempfolder="$(mktemp -d /tmp/makemultilinedisklabel.XXX)"
	


	IFS=$'\n'
	local linenum=0
	local theline=""
	local theoneline=""
	for theline in $(echo "$lines"); do
		./disklabel -e "$theline" "$tempfolder/.disk_label" "$tempfolder/.disk_label_2x"
		if (( linenum )); then
			alllines+="$(dump_label "$tempfolder/.disk_label" | sed '1,/[^.]/ {/^[.]*$/d; }')"$'\n'
			alllines2x+="$(dump_label "$tempfolder/.disk_label_2x" | sed '1,/[^.]/ {/^[.]*$/d; }')"$'\n'
			theoneline+=" $theline"
		else
			alllines+="$(dump_label "$tempfolder/.disk_label")"$'\n'
			alllines2x+="$(dump_label "$tempfolder/.disk_label_2x")"$'\n'
			theoneline="$theline"
		fi
		((linenum++))
	done

	local suffix=""
	local thelines=""
	for suffix in "" "_2x"; do
		[[ -z $suffix ]] && thelines="$alllines" || thelines="$alllines2x"

		local linewidths=""
		local maxlinewidth=""
		linewidths="$(echo "${thelines}" | tr '0-9a-f' '.' | sort -ur)"
		maxlinewidth=$(echo "$linewidths" | sed -n '1p')
		linewidths=$(echo "$linewidths" | sed '1d')

		local centercommands=""
		local linewidth=""
		for linewidth in $(echo "$linewidths"); do
			local left=${maxlinewidth:0:(${#maxlinewidth}-${#linewidth})/4*2}
			local right=${maxlinewidth:0:(${#maxlinewidth}-${#linewidth}-${#left})}
			centercommands+="s/^(${linewidth})$/$left\1$right/; "
		done
		thelines=$(echo "$thelines" | sed -E "$centercommands s/\./0/g")
		printf "01%04x%04x$thelines" $((${#maxlinewidth} / 2)) "$(echo "$thelines" | wc -l)" | xxd -p -r > "$tempfolder/disk_label$suffix"
		
		# EFI file system converts schg flag to uchg flag, so we set both to no
		[[ -f "$folder/.disk_label$suffix" ]] && {
			sudo chflags noschg,nouchg "$folder/.disk_label$suffix"
		}
		sudo cp "$tempfolder/disk_label$suffix" "$folder/.disk_label$suffix"
	done

	[[ -f "$folder/.disk_label.contentDetails" ]] && { 
		sudo chflags noschg,nouchg "$folder/.disk_label.contentDetails"
	}
	theoneline="${theoneline/🄳/ [D]}"
	theoneline="${theoneline/🄿/ [P]}"
	theoneline="${theoneline/🅁/ [R]}"
	theoneline="${theoneline/🄱/ [B]}"
	theoneline="${theoneline//  / }"
	printf "%s" "$theoneline" > "$tempfolder/disk_label.contentDetails"
	sudo cp "$tempfolder/disk_label.contentDetails" "$folder/.disk_label.contentDetails"
}


# When you use do shell script in AppleScript, it  runs the command in a new shell environment,
# and the default working directory for that shell is the root directory /.
base_of_me=$(dirname "$0")
cd "$base_of_me"

makemultilinedisklabel "$1" "$2"